#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

typedef long long LL;

int n, k;
LL a[N];

LL calc(int x)
{
	LL cnt = 0;
	for(int i = 1; i <= n; i++) 
	{
		cnt += a[i] / x;
	}

	return cnt;
}

int main()
{
	//n根木头，要切成多少段已经定了，求最大能切割的长度
	//思路：
	//1. x表示切割出来的小段的长度
	//	c表示在x的基础下，最多能切出来多少段
	//	k表示最终要切割的段数
	//2.切割出来的长度越长，段数越少
	//3.最终结果切出来的段数一定是大于等于k的->二段性
	//	<----切出来的段数是大于等于k的 ； 切出来的段数是小于目标段数k的---->
	cin >> n >> k;
	for(int i = 1; i <= n; i++) cin >> a[i];

	//最终切割出来的段数一定大于等于k
	LL left = 0, right = 1e8;
	while(left < right)
	{
		LL mid = left + (right - left + 1) / 2;
		if(calc(mid) >= k) left = mid;
		else right = mid - 1;
	}
	cout << left << endl;


	return 0;
}